#include<reg51.h>
#define uchar unsigned char
uchar num, sec;
sbit P32 = P3^2;
sbit P33 = P3^3;

void main()
{
	TMOD=0x01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	
	EA=1; //CPU中断允许总控制位
	ET0=1; //定时/计数器T0中断允许位
	EX0=1; //外部中断0允许位
	EX1=1; //外部中断1允许位
	IT0=0; //外部中断0触发方式
	IT1=0; //外部中断1触发方式
	TR0=1; //启动定时/计数器T0
	
	while(1)
	{
		if(sec<=30) //0s~30s：东西方向通行
			P1=0xf3;
		if((sec>30)&&(sec<=33))//30s~33s：东西方向绿灯闪烁
		{
			if(num==0)
				P1=0xfb; //灭灯0.5s
			if(num==10)
				P1=0xf3; //亮灯0.5s
		}
		if((sec>33)&&(sec<=35))//33s~35s：东西方向黄灯亮
			P1=0xeb; //黄灯亮2s
		if((sec>35)&&(sec<=65))//35s~65s：南北方向通行
			P1=0xde; //南北绿灯亮30s
		if((sec<=68)&&(sec>65))//65s~68s：南北方向绿灯闪烁
		{
			if(num==0)
				P1=0xdf;
			if(num==10)
				P1=0xde;
		}
		if((sec<=70)&&(sec>68))//68s~70s：南北方向黄灯亮
			P1=0xdd; //黄灯亮2s
		if(sec==70)
			sec=0; //0s~70s,重复循环
	}
}

void time0() interrupt 1 //定时/计数器T0
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	num++;
	if(num==20) // 20*50ms=1s
	{
		sec++; //累加1秒
		num=0;
	}
}

void int0() interrupt 0 //外部中断0：高优先级
{
	TR0=0; //关闭定时/计数器T0
	P1=0xdb; //南北和东西方向均亮红灯
	while(P32==0); //当按住S1，则进入该死循环
	TR0=1; //启动定时/计数器T0
}

void int1() interrupt 2 //外部中断1：低优先级
{
	TR0=0; //关闭定时/计数器T0
	P1=0xf3; //东西方向通行
	while(P33==0); //当按住S2，则进入该死循环
	TR0=1; //启动定时/计数器T0
}
